package com.泛型.类型通配符;
/*类型通配符：为表示各种泛型list的父类
* 任何泛型List的父类:List<?>
  某一类泛型list的父类
  *     使用类型通配符的上限 List<?extends Number>:Number或者其子类
  *     使用类型通配符的下限 List<?super Number>:Number或者其父类*/
import java.util.List;
import java.util.ArrayList;
public class Demo {
    public static void main(String[] args) {
        //类型通配符
        List<?> l1 = new ArrayList<Object>();
        List<?> l2 = new ArrayList<Number>();
        List<?> l3 = new ArrayList<Integer>();
        /*java.lang.Object
                java.lang.Number
                    java.lang.Integer */

        //类型通配符上限
//        List<?extends Number> l4 = new ArrayList<Object>(); 不兼容的类型
        List<?extends Number> l4 = new ArrayList<Number>();
        List<?extends Number> l5 = new ArrayList<Integer>();
//        List<?extends Number> l10 = new ArrayList<String>();
        //类型通配符下限
        List<?super Object> l6 = new ArrayList<Object>();
//        List<?super Object> l7 = new ArrayList<Number>(); 不兼容的类型
        List<?super Integer> l8 = new ArrayList<Number>();
        List<?super Integer> l9 = new ArrayList<Object>();
    }
}
/*总结 ：
* 1.类型通配符的上限限制了最大的类型如List<?extends Number>,表示所有继承了Number的泛型,只能创建Number及其子类，
* 非Number子类或其父类属于不兼容的类型,无法创建
* 2.类型通配符的下限限制了最小的类型如List<?super Number>,表示所有Number能够访问的父类的泛型,只能创建Number及其父类,
* 非Number父类或其子类属于不兼容类型,无法创建*/